/******************************************************************************
*
* MODULE:    Lcd.v
* DEVICE:     
* PROJECT:   Tarea 2 Diseño Electronico Digital
* AUTHOR:    Ricardo Dávila Castro   
* DATE:      2010 19:35:08
*
* ABSTRACT:  Lcd Ejercicio 2
*            
*******************************************************************************/

`ifndef 	LCD
`define    LCD


module Lcd (
input CLK,
input RST,
output clock,
output reg lcd_rs,
output lcd_en,
output reg lcd_rw,
output reg[3:0] lcd_db
);


reg [8:0] EstadoActual=0;
reg [8:0] EstadoSiguiente=0;
reg [23:0] clk_div=0;


wire wCLK;

parameter     Inicio  		='h 00,
		   		EstadoUno   ='h 01,
		   		EstadoDos   ='h 02,
		   		EstadoTres  ='h 03,
		   		EstadoCuatro='h 04,
		   		EstadoCinco ='h 05,
		   		EstadoSeis  ='h 06,
		   		EstadoSiete ='h 07,
		   		EstadoOcho  ='h 08,
		   		EstadoNueve ='h 09,
		   		EstadoDiez  ='h 0a,
		   		EstadoOnce 	='h 0b,
		   		EstadoDoce  ='h 0c,
		   		EstadoTrece ='h 0d,
		   		EstadoCatorce = 'h 0e,
		   		EstadoQuince ='h 0f,
		   		EstadoDiezSeis ='h 10,
				EstadoDiezSiete = 'h 11,
				EstadoDiezOcho = 'h 12,
				EstadoDiezNueve = 'h 13,
				EstadoVeinte = 'h 14,
				EstadoVeintiUno = 'h 15,
				EstadoVeintiDos = 'h 16,
				EstadoVeintiTres = 'h 17,
				EstadoVeintiCuatro = 'h 18,
				EstadoVeintiCinco = 'h 19,
				EstadoVeintiSeis = 'h 1A,
				EstadoVeintiSiete = 'h 1B,
				EstadoVeintiOcho = 'h 1C,
				EstadoVeintiNueve = 'h 1D,
				EstadoTreinta = 'h 1E,
				EstadoTreintaUno = 'h 1F,
				EstadoTreintaDos = 'h 20,
				EstadoTreintaTres = 'h 21,
				EstadoTreintaCuatro = 'h 22,
				EstadoTreintaCinco = 'h 23;

assign lcd_en = EstadoOnce ? wCLK ~^ clk_div[13] : 0;
assign clock = wCLK ;
always @ (*)
	begin
		
		lcd_db = 0;
		lcd_rs = 0;
		lcd_rw = 0;
		
		EstadoSiguiente=EstadoActual;
		
		case(EstadoActual)
			Inicio:	begin lcd_db = 'h2;	EstadoSiguiente = EstadoUno	;	end
			EstadoUno:	begin 	lcd_db = 'h2; EstadoSiguiente = EstadoDos;	end
			EstadoDos:	begin	lcd_db = 'h8; EstadoSiguiente = EstadoTres;	end
			EstadoTres:	begin 	lcd_db = 'h0; EstadoSiguiente = EstadoCuatro;	end
			EstadoCuatro: begin	lcd_db = 'hf; EstadoSiguiente = EstadoCinco;	end
			EstadoCinco: begin	lcd_db = 'h0; EstadoSiguiente = EstadoSeis;		end
			EstadoSeis:	begin	lcd_db = 'h2; EstadoSiguiente = EstadoSiete;	end		
			EstadoSiete: begin lcd_db = 'h0; EstadoSiguiente = EstadoOcho; 		end	
			EstadoOcho: begin lcd_db = 'h1; EstadoSiguiente = EstadoNueve; 		end	
			EstadoNueve:	begin   lcd_db = 'h0;  EstadoSiguiente = EstadoDiez;		end	
		  EstadoDiez:	begin   lcd_db = 'h6;  EstadoSiguiente = EstadoOnce;		end
			EstadoOnce:	begin lcd_rs = 1;  lcd_db = 'h4;  EstadoSiguiente = EstadoDoce;		end
			EstadoDoce:	begin  lcd_rs = 1; lcd_db = 'h8;  EstadoSiguiente = EstadoTrece;		end
			EstadoTrece:	begin  lcd_rs = 1; lcd_db = 'h6;  EstadoSiguiente = EstadoCatorce;		end
			EstadoCatorce:	begin  lcd_rs = 1; lcd_db = 'hf;  EstadoSiguiente = EstadoQuince;		end
			EstadoQuince:	begin  lcd_rs = 1; lcd_db = 'h6;  EstadoSiguiente = EstadoDiezSeis;		end
			EstadoDiezSeis:	begin  lcd_rs = 1; lcd_db = 'hc; EstadoSiguiente = EstadoDiezSiete;	end	
			EstadoDiezSiete:	begin  lcd_rs = 1; lcd_db = 'h6; EstadoSiguiente = EstadoDiezOcho;	end	
			EstadoDiezOcho:	begin  lcd_rs = 1; lcd_db = 'h1; EstadoSiguiente = EstadoDiezNueve;	end	
			EstadoDiezNueve:	begin  lcd_rs = 1; lcd_db = 'h2; EstadoSiguiente = EstadoVeinte;	end	
			EstadoVeinte:	begin  lcd_rs = 1; lcd_db = 'h0; EstadoSiguiente = EstadoVeintiUno;	end	
			EstadoVeintiUno:	begin  lcd_rs = 1; lcd_db = 'h5; EstadoSiguiente = EstadoVeintiDos;	end	
			EstadoVeintiDos:	begin  lcd_rs = 1; lcd_db = 'h2; EstadoSiguiente = EstadoVeintiTres;	end	
			EstadoVeintiTres:	begin  lcd_rs = 1; lcd_db = 'h6; EstadoSiguiente = EstadoVeintiCuatro;	end	
			EstadoVeintiCuatro:	begin  lcd_rs = 1; lcd_db = 'h9; EstadoSiguiente = EstadoVeintiCinco;	end	
			EstadoVeintiCinco:	begin  lcd_rs = 1; lcd_db = 'h6; EstadoSiguiente = EstadoVeintiSeis;	end	
			EstadoVeintiSeis:	begin  lcd_rs = 1; lcd_db = 'h3; EstadoSiguiente = EstadoVeintiSiete;	end	
			EstadoVeintiSiete:	begin  lcd_rs = 1; lcd_db = 'h6; EstadoSiguiente = EstadoVeintiOcho;	end	
			EstadoVeintiOcho:	begin  lcd_rs = 1; lcd_db = 'h1; EstadoSiguiente = EstadoVeintiNueve;	end	
			EstadoVeintiNueve:	begin  lcd_rs = 1; lcd_db = 'h7; EstadoSiguiente = EstadoTreinta;	end	
			EstadoTreinta:	begin  lcd_rs = 1; lcd_db = 'h2; EstadoSiguiente = EstadoTreintaUno;	end	
			EstadoTreintaUno:	begin  lcd_rs = 1; lcd_db = 'h6; EstadoSiguiente = EstadoTreintaDos;	end	
			EstadoTreintaDos:	begin  lcd_rs = 1; lcd_db = 'h4; EstadoSiguiente = EstadoTreintaTres;	end	
			EstadoTreintaTres:	begin  lcd_rs = 1; lcd_db = 'h6; EstadoSiguiente = EstadoTreintaCuatro;	end	
			EstadoTreintaCuatro: begin  lcd_rs = 1; lcd_db = 'hf; EstadoSiguiente = EstadoTreintaCinco;	end	
			EstadoTreintaCinco:	begin  lcd_rw = 1; lcd_db = 'h0;  EstadoSiguiente = EstadoTreintaCinco;	end	

			default:
				begin EstadoSiguiente = Inicio; end
		endcase			
	end	
	
always @ (posedge wCLK, posedge RST)
	begin
		if (RST)
			EstadoActual <= Inicio;
		else
			EstadoActual <= EstadoSiguiente;	
	end

always@(posedge CLK) begin
   clk_div <= clk_div + 1'b1;
end

clk_divider clkdiv_inst (.clk_50M(CLK),.clk_out(wCLK) );

endmodule

`endif